10分钟学会MATLAB
MATLAB(Matrix Laboratory)是一种专为数值计算、算法开发和数据可视化设计的高级编程语言和环境。MATLAB 最早开发于 20 世纪 70 年代末,如今已成为工程、科学和数学领域不可或缺的工具。
通过本教程,你将掌握 MATLAB 的基础知识,并开始使用这个强大的计算环境。
1. 你的第一个 MATLAB 程序
创建一个名为 hello.m 的脚本文件,或者直接在 MATLAB 命令窗口中输入命令:
disp('Hello, World!')
也可以使用 fprintf 函数:
fprintf('Hello, World!\n')
输出结果为:
Hello, World!
disp() 函数直接显示内容,而 fprintf() 则提供更灵活的格式化控制,类似于 C 语言的 printf。
2. 基础语法
MATLAB 有自己的语法规则,与大多数通用编程语言有所不同。理解这些基础知识对于编写清晰、可维护的代码至关重要。
2.1 注释
单行注释以百分号 % 开头:
% 这是一条注释
x = 10; % 将 10 赋值给 x
多行注释使用 %{ 和 %}:
%{
这是一条多行注释。
它可以跨越多行。
%}
2.2 分号
分号 ; 用于抑制输出显示。没有分号时,MATLAB 会显示计算结果:
x = 5 % 显示: x = 5
y = 10; % 不显示输出,但 y 已被赋值
2.3 大小写敏感
MATLAB 对大小写敏感。A 和 a 是不同的变量:
A = 5;
a = 10;
disp(A) % 输出: 5
disp(a) % 输出: 10
2.4 变量命名
变量名必须以字母开头,后面可以是字母、数字或下划线:
valid_name = 1;
another_valid_name_123 = 2;
% 123invalid = 3; % 错误:不能以数字开头
2.5 基本运算
MATLAB 在矩阵运算方面表现出色。创建矩阵非常简单:
A = [1 2 3; 4 5 6; 7 8 9] % 3x3 矩阵
输出:
A =
1 2 3
4 5 6
7 8 9
3. 变量和数据类型
MATLAB 使用动态类型系统。变量在赋值时创建,其类型由赋值的值决定。
3.1 数值类型
MATLAB 默认将所有数字存储为双精度浮点数:
% 整数
int_num = 42;
% 浮点数
float_num = 3.14159;
% 科学计数法
sci_num = 2.5e-3; % 0.0025
3.2 字符串
字符串变量使用单引号:
str = 'Hello, MATLAB';
str2 = "Hello, MATLAB"; % 字符串数组 (R2016b+)
字符串拼接:
str1 = 'Hello';
str2 = 'World';
combined = [str1 ', ' str2]; % 'Hello, World'
3.3 逻辑值(布尔值)
逻辑值为 true 或 false:
flag = true;
result = false;
% 逻辑运算
a = true;
b = false;
and_result = a && b; % false
or_result = a || b; % true
not_result = ~a; % false
3.4 字符数组与字符串
MATLAB 同时包含字符数组和字符串对象:
% 字符数组(旧式写法)
char_arr = 'Hello';
% 字符串对象(现代写法,R2016b+)
str_obj = "Hello";
% 字符串对象使用起来更方便
name = "Alice";
greeting = "Hello, " + name; % 自然地实现拼接
4. 数据结构
MATLAB 提供了多种数据结构以满足不同的使用场景。
4.1 向量
向量是一维数组:
% 行向量
row_vec = [1 2 3 4 5];
% 列向量
col_vec = [1; 2; 3; 4; 5];
% 使用冒号运算符
range_vec = 1:5; % [1 2 3 4 5]
step_vec = 0:2:10; % [0 2 4 6 8 10]
% linspace 用于创建等间距值
lin_vec = linspace(0, 10, 5); % [0 2.5 5 7.5 10]
4.2 矩阵
矩阵是 MATLAB 的基础:
% 直接创建矩阵
A = [1 2 3; 4 5 6; 7 8 9];
% 访问元素
element = A(2, 3); % 返回 6(第2行第3列)
% 矩阵运算
B = A'; % 转置
C = A * B; % 矩阵乘法
D = A .* B; % 元素级乘法
4.3 元胞数组
元胞数组可以存储不同类型的数据:
% 创建元胞数组
cell_arr = {1, 'hello', [1 2 3], true};
% 使用花括号访问元胞内容
data = cell_arr{2}; % 返回 'hello'
% 使用圆括号访问元胞
sub_cell = cell_arr(1:2); % 返回 {1, 'hello'}
4.4 结构体
结构体就像带有命名字段的字典:
% 创建结构体
student.name = 'John';
student.age = 20;
student.major = 'Engineering';
% 访问字段
disp(student.name); % 输出: John
% 结构体数组
students(1).name = 'Alice';
students(1).age = 21;
students(2).name = 'Bob';
students(2).age = 22;
4.5 表格
表格适用于表格数据:
% 创建表格
Age = [25; 30; 35];
Name = {'Alice'; 'Bob'; 'Charlie'};
Salary = [50000; 60000; 70000];
T = table(Name, Age, Salary);
% 访问数据
disp(T.Age);
disp(T.Name{1});
5. 运算符
MATLAB 提供了各种算术、比较和逻辑运算符。
5.1 算术运算符
a = 10;
b = 3;
sum = a + b; % 13
diff = a - b; % 7
prod = a * b; % 30
quot = a / b; % 3.3333
int_div = floor(a/b); % 3
mod = mod(a, b); % 1(余数)
pow = a ^ b; % 1000
5.2 元素级运算符
元素级运算符对相应元素进行操作:
A = [1 2 3];
B = [4 5 6];
C = A .* B; % 元素级乘法: [4 10 18]
D = A.^2; % 元素级平方: [1 4 9]
5.3 比较运算符
x = 5;
y = 10;
eq = (x == y); % false
neq = (x ~= y); % true
gt = (x > y); % false
lt = (x < y); % true
ge = (x >= y); % false
le = (x <= y); % true
5.4 逻辑运算符
a = true;
b = false;
and_op = a & b; % false(元素级与)
or_op = a | b; % true(元素级或)
not_op = ~a; % false
and_short = a && b; % false(短路与)
or_short = a || b; % true(短路或)
6. 控制流
MATLAB 提供了标准的控制流结构,但语法与 Python 等语言有所不同。
6.1 if-elseif-else
score = 85;
if score >= 90
grade = 'A';
elseif score >= 80
grade = 'B';
elseif score >= 70
grade = 'C';
else
grade = 'F';
end
disp(grade) % 输出: B
6.2 switch
switch 语句将单个表达式与多个情况进行比较:
day = 'Monday';
switch day
case {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'}
disp('Weekday');
case {'Saturday', 'Sunday'}
disp('Weekend');
otherwise
disp('Invalid day');
end
6.3 for 循环
for 循环遍历一个范围或数组:
% 遍历一个范围
for i = 1:5
disp(i);
end
% 遍历数组
fruits = {'apple', 'banana', 'orange'};
for fruit = fruits
disp(fruit{1});
end
% 嵌套循环用于矩阵运算
A = [1 2; 3 4];
B = zeros(2, 2);
for i = 1:2
for j = 1:2
B(i, j) = A(i, j) * 2;
end
end
6.4 while 循环
count = 0;
while count < 5
disp(count);
count = count + 1;
end
6.5 循环控制
break 语句退出循环,continue 跳到下一次迭代:
% 使用 break
for i = 1:10
if i == 5
break;
end
disp(i);
end
% 输出: 1 2 3 4
% 使用 continue
for i = 1:5
if mod(i, 2) == 0
continue; % 跳过偶数
end
disp(i);
end
% 输出: 1 3 5
7. 输入和输出
7.1 用户输入
使用 input() 函数获取用户输入:
% 获取数值输入
num = input('Enter a number: ');
% 获取字符串输入
name = input('Enter your name: ', 's');
% 获取表达式输入(会计算输入的值)
expr = input('Enter an expression: ');
7.2 显示输出
有几个函数可以显示输出:
% disp - 简单显示
disp('Hello');
disp([1 2 3]);
% fprintf - 格式化输出
name = 'Alice';
age = 25;
fprintf('Name: %s, Age: %d\n', name, age);
% sprintf - 创建格式化字符串
str = sprintf('Value: %.2f', 3.14159);
disp(str);
7.3 格式化说明符
MATLAB 中常用的格式化说明符:
% %s - 字符串
% %d - 整数
% %f - 浮点数
% %.2f - 保留2位小数的浮点数
% %e - 科学计数法
fprintf('%d %.2f %e\n', 42, 3.14159, 1000)
% 输出: 42 3.14 1.000000e+03
8. 函数
MATLAB 中的函数通常定义在单独的文件中,但匿名函数提供了内联创建函数的方式。
8.1 匿名函数
匿名函数可以创建简单函数,无需单独的文件:
% 单个输入
square = @(x) x^2;
disp(square(5)); % 输出: 25
% 多个输入
add = @(x, y) x + y;
disp(add(3, 4)); % 输出: 7
% 多个表达式
hypot = @(x, y) sqrt(x^2 + y^2);
disp(hypot(3, 4)); % 输出: 5
8.2 函数文件
创建一个名为 myfunc.m 的文件:
function y = myfunc(x)
y = x^2 + 1;
end
调用该函数:
result = myfunc(5); % 输出: 26
8.3 多输出函数
function [sum, prod] = calc(x, y)
sum = x + y;
prod = x * y;
end
调用多输出函数:
[s, p] = calc(3, 4);
disp(s); % 7
disp(p); % 12
8.4 可变参数
使用 varargin 和 varargout 处理可变数量的参数:
function result = sum_all(varargin)
result = 0;
for i = 1:length(varargin)
result = result + varargin{i};
end
end
% 可以传入任意数量的参数
total = sum_all(1, 2, 3, 4, 5); % 输出: 15
9. 脚本文件
脚本是包含一系列 MATLAB 命令的 .m 文件。它们对工作空间中的数据进行操作:
% 保存为 myscript.m
% 计算数据集的统计信息
data = [1 2 3 4 5 6 7 8 9 10];
mean_val = mean(data);
std_val = std(data);
max_val = max(data);
min_val = min(data);
fprintf('Mean: %.2f\n', mean_val);
fprintf('Std: %.2f\n', std_val);
fprintf('Max: %d\n', max_val);
fprintf('Min: %d\n', min_val);
10. 错误处理
使用 try-catch 进行错误处理:
try
result = risky_operation();
catch ME
fprintf('Error: %s\n', ME.message);
% 处理错误
result = 0;
end
使用 error() 抛出错误:
function result = divide(a, b)
if b == 0
error('Division by zero is not allowed');
end
result = a / b;
end
11. 文件操作
11.1 保存和加载数据
% 将变量保存到文件
x = [1 2 3];
y = 'hello';
save('data.mat', 'x', 'y');
% 从文件加载变量
load('data.mat');
% 保存到文本文件
writematrix(x, 'data.txt');
% 从文本文件读取
data = readmatrix('data.txt');
11.2 文本文件操作
% 写入文本文件
fid = fopen('output.txt', 'w');
fprintf(fid, 'Line 1\n');
fprintf(fid, 'Line 2\n');
fclose(fid);
% 读取文本文件
fid = fopen('output.txt', 'r');
while ~feof(fid)
line = fgetl(fid);
if ischar(line)
disp(line);
end
end
fclose(fid);
使用 textscan 进行结构化读取:
fid = fopen('data.txt', 'r');
format = '%s %d %f';
C = textscan(fid, format);
fclose(fid);
name = C{1};
age = C{2};
score = C{3};
12. 绘图
MATLAB 的绘图功能是其最强大的特性之一。
12.1 基础二维绘图
x = 0:0.1:2*pi;
y = sin(x);
plot(x, y);
xlabel('x');
ylabel('sin(x)');
title('Sine Wave');
grid on;
12.2 多子图
x = 0:0.1:2*pi;
% 子图
subplot(2, 1, 1);
plot(x, sin(x));
title('Sine');
subplot(2, 1, 2);
plot(x, cos(x));
title('Cosine');
12.3 图表自定义
x = 0:0.1:10;
y1 = x;
y2 = x.^2;
plot(x, y1, 'b-', 'LineWidth', 2); % 蓝色实线
hold on;
plot(x, y2, 'r--', 'LineWidth', 2); % 红色虚线
hold off;
xlabel('X');
ylabel('Y');
legend('Linear', 'Quadratic');
title('Linear vs Quadratic');
grid on;
12.4 其他图表类型
% 条形图
bar([1 2 3 4], [10 20 15 25]);
% 直方图
data = randn(1000, 1);
histogram(data, 30);
% 散点图
x = rand(100, 1);
y = 2*x + randn(100, 1)*0.1;
scatter(x, y);
